package co.edu.eam.persitencia.entidades;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;

/**
 * Entidad que representa el inventario.
 *
 */
@NamedQueries({
    @NamedQuery(name = Inventario.FIND_ENTRADAS, query = ("SELECT inv FROM Inventario"
    + " inv WHERE inv.fechaIngreso=:inv" + Inventario.PARAMETRO_ENTRADA)),
    @NamedQuery(name = Inventario.FIND_SALIDAS, query = ("SELECT inv FROM Inventario"
    + " inv WHERE inv.fechaSalida=:inv" + Inventario.PARAMETRO_SALIDA)),})
@Entity
@Table(name = "clinica_inventrio")
public class Inventario implements Serializable {

    /**
     * constantes para el parametro fechaSalida
     */
    public static final String PARAMETRO_SALIDA = "fechaSalida";
    /**
     * constante para named query de listar las salidas
     */
    public static final String FIND_SALIDAS = "Inventario.findSalidas";
    /**
     * constantes para el parametro fechaEntrada
     */
    public static final String PARAMETRO_ENTRADA = "fechaEntrada";
    /**
     * constante para named query de listar las entrada
     */
    public static final String FIND_ENTRADAS = "Inventario.findEntradas";
    /**
     * Idenificador unico de la entidad.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "inventario_id")
    private Long id;
    /**
     * Articulo del inventario.
     */
    @ManyToOne
    @JoinColumn(name = "inventario_articulo")
    private Articulo articulo;
    /**
     * Fecha de ingreso del articulo.
     */
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "inventario_fechaIngreso")
    private Date fechaIngreso;
    /**
     * Fecha de salida del articulo.
     */
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "inventario_fechaSalida")
    private Date fechaSalida;
    /**
     * Codigo del articulo.
     */
    @Column(name = "inventario_codigo")
    private String codigo;
    /**
     * Motivo por el cual se registra la salida de un articulo.
     */
    @Column(name = "inventario_motivoSalida")
    private String motivoSalida;
    /**
     * Funcionario que ingresa el articulo al inventario.
     */
    @JoinColumn(name = "inventario_funcionarioIngreso")
    @ManyToOne
    private Funcionario funcionarioIngreso;
    /**
     * Funcionario que da salida a el articulo del inventario.
     */
    @JoinColumn(name = "inventario_funcionarioSalida")
    @ManyToOne
    private Funcionario funcionarioSalida;

    /**
     * Constructor sin parametros.
     */
    public Inventario() {
        super();
    }

    /**
     *
     * @param articulo
     * @param fechaIngreso
     * @param fechaSalida
     * @param codigo
     * @param motivoSalida
     * @param funcionarioIngreso
     * @param funcionarioSalida
     *
     *
     */
    public Inventario(Date fechaIngreso, String codigo, Funcionario funcionarioIngreso) {
        this.fechaIngreso = fechaIngreso;
        this.funcionarioIngreso = funcionarioIngreso;
        this.codigo = codigo;
    }

    public Inventario(Articulo articulo, Date fechaIngreso, Date fechaSalida,
            String codigo, String motivoSalida, Funcionario funcionarioIngreso,
            Funcionario funcionarioSalida) {
        super();
        this.articulo = articulo;
        this.fechaIngreso = fechaIngreso;
        this.fechaSalida = fechaSalida;
        this.codigo = codigo;
        this.motivoSalida = motivoSalida;
        this.funcionarioIngreso = funcionarioIngreso;
        this.funcionarioSalida = funcionarioSalida;
    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the articulo
     */
    public Articulo getArticulo() {
        return articulo;
    }

    /**
     * @param articulo the articulo to set
     */
    public void setArticulo(Articulo articulo) {
        this.articulo = articulo;
    }

    /**
     * @return the fechaIngreso
     */
    public Date getFechaIngreso() {
        return fechaIngreso;
    }

    /**
     * @param fechaIngreso the fechaIngreso to set
     */
    public void setFechaIngreso(Date fechaIngreso) {
        this.fechaIngreso = fechaIngreso;
    }

    /**
     * @return the fechaSalida
     */
    public Date getFechaSalida() {
        return fechaSalida;
    }

    /**
     * @param fechaSalida the fechaSalida to set
     */
    public void setFechaSalida(Date fechaSalida) {
        this.fechaSalida = fechaSalida;
    }

    /**
     * @return the codigoBarras
     */
    public String getCodigoBarras() {
        return codigo;
    }

    /**
     * @param codigoBarras the codigoBarras to set
     */
    public void setCodigoBarras(String codigoBarras) {
        this.codigo = codigoBarras;
    }

    /**
     * @return the funcionarioSalida
     */
    public Funcionario getFuncionarioSalida() {
        return funcionarioSalida;
    }

    /**
     * @param funcionarioSalida the funcionarioSalida to set
     */
    public void setFuncionarioSalida(Funcionario funcionarioSalida) {
        this.funcionarioSalida = funcionarioSalida;
    }

    /**
     * @return the funcionarioIngreso
     */
    public Funcionario getFuncionarioIngreso() {
        return funcionarioIngreso;
    }

    /**
     * @param funcionarioIngreso the funcionarioIngreso to set
     */
    public void setFuncionarioIngreso(Funcionario funcionarioIngreso) {
        this.funcionarioIngreso = funcionarioIngreso;
    }

    /**
     * @return the motivoSalida
     */
    public String getMotivoSalida() {
        return motivoSalida;
    }

    /**
     * @param motivoSalida the motivoSalida to set
     */
    public void setMotivoSalida(String motivoSalida) {
        this.motivoSalida = motivoSalida;
    }

    //TODO:falta toString
    @Override
    public boolean equals(Object obj) {

        Inventario inv = (Inventario) obj;
        return codigo.equals(inv.codigo);

    }
}
